﻿using System.Collections;
using System.Collections.Generic;
using LogSystem;
using UnityEngine;

namespace Yoozoo.Gameplay.Liberty.AI
{
    public class AnimationStateBehaviour : StateMachineBehaviour
    {
        public AnimationState state = AnimationState.Undefine;

        private AnimationAgent _animationAgent;
        
        // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
        override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            OnAnimationEnter(animator, layerIndex, stateInfo.fullPathHash);
        }

        // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
        override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            OnAnimationUpdate(animator, layerIndex, stateInfo.fullPathHash);
        }

        // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
        override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            OnAnimationExit(animator, layerIndex, stateInfo.fullPathHash);
        }

        // OnStateMove is called right after Animator.OnAnimatorMove()
        //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        //{
        //    // Implement code that processes and affects root motion
        //}

        // OnStateIK is called right after Animator.OnAnimatorIK()
        //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        //{
        //    // Implement code that sets up animation IK (inverse kinematics)
        //}
        
        void OnAnimationEnter(Animator animator, int layerIndex, int fullPathHash)
        {
            if (!_animationAgent)
            {
                _animationAgent = animator.GetComponent<AnimationAgent>();
                _animationAgent?.OnAnimationEnter(layerIndex, state, fullPathHash);
            }
            else
            {
                _animationAgent.OnAnimationEnter(layerIndex, state, fullPathHash);
            }
            
        }
        
        void OnAnimationUpdate(Animator animator, int layerIndex, int fullPathHash)
        {
            if (!_animationAgent)
            {
                _animationAgent = animator.GetComponent<AnimationAgent>();
                _animationAgent?.OnAnimationUpdate(layerIndex, state, fullPathHash);
            }
            else
            {
                _animationAgent.OnAnimationUpdate(layerIndex, state, fullPathHash);
            }
            
        }
        
        void OnAnimationExit(Animator animator, int layerIndex, int fullPathHash)
        {
            if (!_animationAgent)
            {
                _animationAgent = animator.GetComponent<AnimationAgent>();
                _animationAgent?.OnAnimationExit(layerIndex, state, fullPathHash);
            }
            else
            {
                _animationAgent.OnAnimationExit(layerIndex, state, fullPathHash);
            }
            
        }

    }
}